"""
spark 和 pyspark ：
    1、spark是apache基金会旗下的顶级开源项目，用于对海量数据进行大规模分布式计算
    2、pyspark是spark的python实现，是spark为python开发者提供的编程入口，用于以python语言完成spark任务的开发
    3、pyspark不仅可以作为python的第三方库，也可以将程序提交的spark集群环境中，调度大规模集群进行执行
    4、是大数据开发中的核心技术
python安装pyspark：
    1、使用cmd命令：pip install pyspark
    2、使用镜像网址下载安装： pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyspark
    3、pyspark编程三大步骤：
        1、数据输入：通过SparkContext类对象的成员方法完成数据的读取操作，读取后得到RDD类对象
        2、数据处理技术：通过RDD类对象的成员方法完成各种数据技术的需求
        3、数据输出：将处理完成后的RDD对象调用各种成员方法完成写出文件，转为list等操作
    4、RDD对象：
        1、RDD对象称之为分布式弹性数据集，是pyspark中数据计算的载体，他可以提供
            1）提供数据存储
            2）提供数据计算的各类方法
            3）数据计算的方法，返回值依旧是RDD
        2、如何得到RDD对象：
            # 通过SparkContext类对象的parallelize方法读取python的数据容器，成为RDD对象
            sc.parallelize(数据容器内容)
            # 通过SparkContext类对象的textFile方法读文件数据，成为RDD对象
            sc.textFile("文件路径/文件名")
        3、RDD对象的成员方法（也称之为算子）
            1)map(func)：将rdd对象的每一个元素传入func中进行计算并且得到一个返回值，组成新的RDD对象返回
                func实际是外部自定义的一个函数，必须接收一个参数和返回一个值
            2）flatMap(func)：计算逻辑和map()算子一样。多了一个解除嵌套的功能

"""

# pyspark的执行环境入口对象是：SparkContext的类对象
# 导入包 及要使用的方法/类
from pyspark import SparkConf, SparkContext

# 创建SparkConf()类对象
conf = SparkConf().setMaster("local[*]").setAppName("test_spark_app")
# 基于SparkConf类对象创建SparkContext对象
sc = SparkContext(conf=conf)
# 打印pyspark运行版本
print(sc.version)

# 通过parallelize方法读取python数据容器
rdd1 = sc.parallelize("hello world")   # 字符串
rdd2 = sc.parallelize([1,2,3,4])   # 数组
rdd3 = sc.parallelize(("猫猫",1,2))   # 元组
rdd4 = sc.parallelize({1,2,3})   # 集合
rdd5 = sc.parallelize({"key1":1,"key2":2})   # 字典

# 通过textFile方法读取文件数据
sc.textFile("")

# 输出RDD类对象内容
print(rdd1.collect())
print(rdd2.collect())
print(rdd3.collect())
print(rdd4.collect())
print(rdd5.collect())

# RDD成员方法 map(func)方法
# 将rdd2中的每一个元素*10
rdd2 = sc.parallelize([1,2,3,4])   # 数组
# 自定义方法
def func(date):
    return date * 10

new_rdd = sc.map(func)  # 函数作为参数传入，map方法会将rdd对象的每个元素都调用一边func方法，存储为新的rdd
new_rdd = sc.map(lambda x:x*10)    # 匿名函数
print(new_rdd.collect())

# 链式调用 返回值都是rdd对象时可以使用链式调用
new_rdd = sc.map(lambda x:x*10).map(lambda x:x+5)    # 每一个元素都*10+5



# 嵌套例子
list1 = [[1,2],[2,3],[4,3]]
# 解除嵌套
list2 = [1,2,2,3,4,3]

# flatMap()方法
rdd6 = sc.parallelize(["abc bcd","efc acd"])
# 需求 将rdd数据中的单词一个一个提取出来
rdd6.flatMap(lambda x:x.split(" "))   # 通过字符串分割得到每一个单次

# 停止SparkContext对象的运行（停止pyspark程序）
sc.stop()

# 好多不想学了